跳到主要内容

模型设计是怎么样的

深度神经网络中的多层结构是基于以下几点考虑的:

  1. 特征的层次性:在图像识别中,较低层的神经元可能会检测到简单的边缘和纹理,中间层可能会检测到更复杂的形状和模式,而较高层可能会检测到整个对象或对象的部分。通过多层结构,网络可以学习从简单到复杂的特征层次。

  2. 更大的表示能力:增加层数可以增加网络的表示能力,使其能够拟合更复杂的函数。但这也可能导致过拟合,特别是当训练数据有限时。

  3. 实验验证:深度学习的很多进展都是基于实验的。研究者们尝试了不同的网络结构,并在验证集或测试集上评估它们的性能。深度网络在多个任务上都表现出色,这进一步推动了深度网络结构的研究。

  4. 计算能力的增长:随着 GPU 和其他硬件的进步,训练更深的网络变得可行。这使得研究者们可以探索和实验更深的网络结构。

  5. 技术进步:一些关键的技术进展,如批量归一化、残差连接和更高效的优化算法,使得训练更深的网络变得更加稳定和快速。

关于模型的设计:

  1. 启发式方法:很多网络结构的设计都是基于经验和直觉的。例如,某些层的滤波器数量、层的数量或连接模式可能是基于先前工作的启示或实验结果。

  2. 结构搜索:近年来,自动机器学习 (AutoML) 和神经结构搜索 (NAS) 已经被用来自动寻找最佳的网络结构。这些方法使用搜索算法(如进化算法或强化学习)来探索可能的网络结构,并选择在验证集上表现最好的结构。

  3. 问题特定的设计:某些网络结构可能是为特定的任务或数据集而设计的。例如,对于时间序列数据,循环神经网络 (RNN) 或长短时记忆网络 (LSTM) 可能是更好的选择。

  4. 模块化和重复:许多现代网络结构,如 VGG、ResNet 和 Transformer,都采用了模块化和重复的设计。这意味着网络中的某些部分(如卷积块或残差块)会被重复多次。

总的来说,神经网络结构的设计是一个复杂的过程,涉及到直觉、经验、实验验证和技术进步的结合。

Loss 不下降,精度不上升

问题考虑方向

1、模型结构和特征工程存在问题 如果一个模型的结构有问题,那么它就很难训练,通常,自己“自主研发”设计的网络结构可能很难适应实际问题,通过参考别人已经设计好并实现和测试过的结构,以及特征工程方案,进行改进和适应性修改,可以更快更好的完成目标任务。当模型结构不好或者规模太小、特征工程存在问题时,其对于数据的拟合能力不足,是很多人在进行一个新的研究或者工程应用时,遇到的第一个大问题。

2、权重初始化方案有问题 神经网络在训练之前,我们需要给其赋予一个初值,但是如何选择这个初始值,则要参考相关文献资料,选择一个最合适的初始化方案。常用的初始化方案有全零初始化、随机正态分布初始化和随机均匀分布初始化等。合适的初始化方案很重要,用对了,事半功倍,用不对,模型训练状况不忍直视。博主之前训练一个模型,初始化方案不对,训练半天都训练不动,loss值迟迟居高不下,最后改了初始化方案,loss值就如断崖式下降。

3、正则化过度 L1 L2 和 Dropout 是防止过拟合用的,当训练集 loss 下不来时,就要考虑一下是不是正则化过度,导致模型欠拟合了。一般在刚开始是不需要加正则化的,过拟合后,再根据训练情况进行调整。如果一开始就正则化,那么就难以确定当前的模型结构设计是否正确了,而且调试起来也更加困难。

4、选择合适的激活函数、损失函数 不仅仅是初始化,在神经网络的激活函数、损失函数方面的选取,也是需要根据任务类型,选取最合适的。

比如,卷积神经网络中,卷积层的输出,一般使用ReLu作为激活函数,因为可以有效避免梯度消失,并且线性函数在计算性能上面更加有优势。而循环神经网络中的循环层一般为tanh,或者ReLu,全连接层也多用ReLu,只有在神经网络的输出层,使用全连接层来分类的情况下,才会使用softmax这种激活函数。

而损失函数,对于一些分类任务,通常使用交叉熵损失函数,回归任务使用均方误差,有自动对齐的任务使用CTC loss等。损失函数相当于模型拟合程度的一个评价指标,这个指标的结果越小越好。一个好的损失函数,可以在神经网络优化时,产生更好的模型参数。

5、模型训练遇到瓶颈 这里的瓶颈一般包括:梯度消失、大量神经元失活、梯度爆炸和弥散、学习率过大或过小等。

梯度消失时,模型的 loss 难以下降,就像走在高原上,几乎任何地方都是高海拔,可以通过梯度的检验来验证模型当前所处的状态。有时梯度的更新和反向传播代码存在bug时,也会有这样的问题。

在使用 Relu 激活函数的时候,当每一个神经元的输入 X 为负时,会使得该神经元输出恒为 0,导致失活,由于此时梯度为 0,无法恢复。有一种解决方案是使用 LeakyRelu,这时,Y 轴的左边图线会有一个很小的正梯度,使得神经网络在一定时间后可以得到恢复。不过 LeakyRelu 并不常用,因为部分神经元失活并不影响结果,相反,这种输出为 0 还有很多积极的作用。因为 Relu 方程输入为负时,输出值为 0,利用此特性可以很好地忽略掉卷积核输出负相关信息,同时保留相关信息。

6、batch size 过大 batch size 过小,会导致模型后期摇摆不定,迟迟难以收敛,而过大时,模型前期由于梯度的平均,导致收敛速度过慢。一般 batch size 的大小常常选取为 32,或者 16,有些任务下比如 NLP 中,可以选取 8 作为一批数据的个数。不过,有时候,为了减小通信开销和计算开销的比例,也可以调整到非常大的值,尤其是在并行和分布式中。

实践中的解决方案

一开始就有相对较大的 loss,以及几乎为 0 的精度,然而长时间训练 loss 迟迟不下降,精度迟迟不上升,即神经网络总是不能很好地拟合训练数据,那么这就是欠拟合了。

欠拟合类型包含神经网络模型结构问题和神经网络设置问题。

1、判断欠拟合是否是神经网络结构问题

技巧就是让神经网络在每次训练只迭代同样的数据,比如只迭代一个 batch 的数据,观察这一个 batch 中 loss 值和 Accuracy 值的变化。如果发现神经网络的 Loss 开始下降,Accuracy 也开始上升了,并且在训练了一段时间后神经网络能够正确地计算出所训练样本经过神经网络的输出值了,那么这种情况属于神经网络的结构问题。神经网络拟合能力不足,只能拟合小量级的数据。对于大量的数据样本,神经网络无法去拟合全部数据,只能拟合大量样本的整体特征,或者少数样本的具体特征。

解决方法:增大模型的复杂程度,包括增加神经网络的层数和神经网络的宽度。但是同等情况下,增加神经网络宽度效果明显不如增加层数,而且要想达到较好的效果,需要增加的神经元数远超过增加一层增加的神经元数。深度深比宽度宽的模型更优这一点,是大家普遍认同的。

2、如果经过以上操作,依然没有改善,loss 依然不下降,即使是少量数据也不能良好的拟合,如果模型本身思想实现没有问题,那就是神经网络的设置问题了